package jp.ne.iforce.android.wifioffload;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.StringReader;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpParams;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import jp.ne.iforce.android.wifioffload.R;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;

public class BarCodeActivity extends Activity implements Runnable {

	final static String TAG = "WifiOffload";

	private static final int INCORRECT_BARCODE_TYPE = 0;
	private static String SERVER_XML_URL = "http://iforce.xsrv.jp/wifioffload/test.xml";

	private FinderView mFinderView;
	private Preview mPreview;

	// バーコードタイプが解析対象外の場合に表示するダイアログの説明文
	private String mIncorrectBarcodeError;

	private ProgressDialog progressDialog;

	// メソッド間の受け渡しのためだけに使う
	private String mBarcodeType;
	private String dl_url; // profileダウンロードURL
	private String dl_pass; // profileダウンロードPass
	private String aps; // バーコードから読み取った製造番号

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// 画面を明るい状態に保つ
		Window window = getWindow();
		window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
		window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
		requestWindowFeature(Window.FEATURE_NO_TITLE);

		setContentView(R.layout.barcode);

		// プレビュー用のファインダーを表示する
		mFinderView = (FinderView) findViewById(R.id.viewfinder_view);
		mPreview = (Preview) findViewById(R.id.preview_surface);
		mPreview.setFinder(mFinderView);

		mIncorrectBarcodeError = getResources().getString(
				R.string.incorrect_barcode_error);
	}

	void requestAutoFocus() {
		mPreview.requestAutoFocus();
	}

	@Override
	protected void onStop() {
		super.onStop();
		mPreview.closeCamera();
	}

	// バーコードの内容が解析できな場合にダイアログを表示する
	void showIncorrectDialog(String barcodeType) {
		mBarcodeType = barcodeType;
		showDialog(INCORRECT_BARCODE_TYPE);
	}

	// ダイアログの表示。ボタンが押されると再度解析を開始する
	@Override
	protected Dialog onCreateDialog(int id) {
		switch (id) {
		case INCORRECT_BARCODE_TYPE:
			return new AlertDialog.Builder(BarCodeActivity.this)
					.setIcon(R.drawable.alert_dialog_icon)
					.setTitle(mBarcodeType + " : " + mIncorrectBarcodeError)
					.setPositiveButton(R.string.alert_dialog_ok,
							new DialogInterface.OnClickListener() {
								public void onClick(DialogInterface dialog,
										int whichButton) {
									// オートフォーカス開始
									mPreview.requestAutoFocus();
								}
							})
					.setNegativeButton(R.string.alert_dialog_cancel,
							new DialogInterface.OnClickListener() {
								public void onClick(DialogInterface dialog,
										int whichButton) {
									// オートフォーカス開始
									mPreview.requestAutoFocus();
								}
							}).create();
		}
		return null;
	}

	void getProfile() {

		// 通信中ダイアログを表示させる。
		progressDialog = new ProgressDialog(this);
		progressDialog.setTitle("通信中");
		progressDialog.setMessage("プロファイル情報取得中・・・");
		progressDialog.setIndeterminate(false);
		progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
		progressDialog.show();
		Thread thread = new Thread(this);
		thread.start();

	}

	public void run() {

		// DefaultHttpClient生成
		HttpClient httpClient = new DefaultHttpClient();
		StringBuilder uriBuilder = new StringBuilder(SERVER_XML_URL);
		HttpGet request = new HttpGet(uriBuilder.toString());
		HttpResponse res = null;

		// パラメータ設定
		HttpParams httpParams = httpClient.getParams();
		httpParams.setParameter("cube_serial", aps);
		request.setParams(httpParams);

		// リクエスト
		try {
			res = httpClient.execute(request);
		} catch (ClientProtocolException e1) {
			e1.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}

		// リクエストした結果のステータスを取得
		int status = res.getStatusLine().getStatusCode();

		// リクエスト結果のステータスが成功：200だったら結果をパース
		if (status == HttpStatus.SC_OK) {
			try {

				// レスポンスをOutputStreamに書き出す
				ByteArrayOutputStream ostream = new ByteArrayOutputStream();
				res.getEntity().writeTo(ostream);

				// XMLパーサーを生成
				final XmlPullParserFactory factory = XmlPullParserFactory
						.newInstance();
				final XmlPullParser parser = factory.newPullParser();

				// XMLパーサに解析したい内容を設定
				parser.setInput(new StringReader(ostream.toString()));

				// XML文章の終わりまでループして解析
				for (int eventType = parser.getEventType(); eventType != XmlPullParser.END_DOCUMENT; eventType = parser
						.next()) {
					String tagName;
					String tagText;
					switch (eventType) {
					// TAGの始まり
					case XmlPullParser.START_TAG:
						// TAGの名前を取得
						tagName = parser.getName();

						// TAGの名前がurl
						if (tagName.equals("url")) {
							// 次の要素へ進む
							parser.next();

							// 要素がTEXTだったら内容を取り出す
							if (parser.getEventType() == XmlPullParser.TEXT) {
								tagText = parser.getText();
								dl_url = tagText;
								Log.d(TAG, tagText);
							}
						}

						// TAGの名前がpass
						if (tagName.equals("pass")) {
							// 次の要素へ進む
							parser.next();

							// 要素がTEXTだったら内容を取り出す
							if (parser.getEventType() == XmlPullParser.TEXT) {
								tagText = parser.getText();
								dl_pass = tagText;
								Log.d(TAG, tagText);
							}
						}

						break;
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		// ダイアログ表示用
		try {
			Thread.sleep(4000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		handler.sendEmptyMessage(0);
	}

	public void setAps(String aps) {
		this.aps = aps;
	}

	private Handler handler = new Handler() {
		public void handleMessage(Message msg) {
			Intent i = new Intent(getApplicationContext(), SmsActivity.class);
			i.putExtra("SEND_TEXT", aps + "\n" + dl_url);
			i.putExtra("DL_PASS", dl_pass);
			startActivity(i);
			progressDialog.dismiss();
		}
	};

	@Override
	protected void onPause() {
		super.onPause();
		finish();
	}

}